#define _CRT_SECURE_NO_WARNINGS
#pragma warning(disable:6031)
#include <stdio.h>

//int main()
//{
//	int arr[][4] = { {1,2}, {3, 4}, {4, 5} };	// 列数不能省略
//	int i = 0;
//	int j = 0;
//	int* p = &arr[0][0];
//	for ( i = 0; i < 12; i++)
//	{
//		printf("%d ", *p);
//		p++;
//	}
//
//	for ( i = 0; i < 3; i++)
//	{
//		for ( j = 0; j < 4; j++)
//		{
//			printf("&arr[%d][%d] = %p\n", i, j, &arr[i][j]);
//		}
//	}
//	 二位数组在内存中也是连续存放的！
//	 一行内部连续，行与行之间连续，因此列数不能省略
//
//
//	return 0;
//}

//void bubble_sort(int arr[], int sz)
//{
//	int i = 0;
//	for ( i = 0; i < sz - 1; i++)
//	{
//		int j = 0;
//		int flag = 1;
//		for ( j = 0; j < sz -1 - i; j++)
//		{
//			if (arr[j] > arr[j+1])
//			{
//				int temp = arr[j];
//				arr[j] = arr[j + 1];
//				arr[j + 1] = temp;
//				flag = 0;
//			}
//		}
//		if (flag)
//		{
//			break;	// 发现已经是升序
//		}
//	}
//}

//int main()
//{
//	int arr[] = { 9, 8, 7 ,6, 5, 4, 3, 2, 1, 0 };
//	//排序为升序 - 冒泡排序
//	int sz = sizeof(arr) / sizeof(arr[0]);
//	bubble_sort(arr, sz);
//
//	return 0;
//}

//数组名是什么？
//数组名是数组首元素的地址
//但是由2个例外
//1.sizeof(数组名) - 数组名表示整个数组 - 计算的是整个数组的大小单位是字节
//2.&数组名 - 数组名表示整个数组 - 取出的是整个数组的地址
//int main()
//{
//	int arr[10] = { 0 };
//	printf("%p\n", &arr);	//1 - &arr取出的是数组的地址
//	printf("%p\n", &arr+1);	//
//
//	printf("%p\n", arr);	//2
//	printf("%p\n", arr+1);	//2
//
//	//printf("%p\n", &arr[0]);//3
//
//	//int sz = sizeof(arr);	//数组名表示整个数组
//	//printf("%d\n", sz);
//
//	//printf("%p\n", &arr[0]);
//	//printf("%p\n", arr);	//数组名是首元素的地址
//}

//int main()
//{
//	int a = 2;
//	int b = a << 1;	//左移操作符：左边丢弃，右边补0
//
//	printf("b = %d\n", b);
//
//	return 0;
//}

//原码：直接根据数值写出的二进制序列
//反码：正数的反码等于原码，复数原码的符号位不变，其他位按位取反
//补码：正数的补码就是原码，负数的补码等于反码+1
//0的反码、补码都是0
//int main()
//{
//	int a = -1;
//	int b = a >> 2;	//算术右移
//	//右移
//	//1.算术右移：右边丢弃，左边补原符号位
//	//2.逻辑右移：右移丢弃，左边补0
//
//	printf("b = %d\n", b);
//
//	return 0;
//}

//不通过中间变量交换a和b
//int main()
//{
//	int a = 3;
//	int b = 5;
//
//	//数值太大会溢出
//	//a = a + b;
//	//b = a - b;
//	//a = a - b;
//
//	// a ^ a = 0
//	// a ^ 0 = a
//	a = a ^ b;
//	b = a ^ b;
//	a = a ^ b;
//
//	printf("a = %d, b = %d\n", a, b);
//
//	return 0;
//}

//int main()
//{
//	int a = 13;
//	//把a的二进制中的第5位置成1
//	a = a | (1 << 4);
//	printf("a = %d\n", a);
//	//把a的二进制中的第5位置成0
//	a = a & ~(1 << 4);
//	printf("a = %d\n", a);
//
//	return 0;
//}

//int main()
//{
//	//int a = 10;
//	//printf("%d\n", sizeof(a));
//	//printf("%d\n", sizeof(int));
//	//printf("%d\n", sizeof a);
//	//sizeof是一个操作符，不是函数
//
//	//int arr[10] = { 0 };
//	//printf("%d\n", sizeof(arr));
//	//printf("%d\n", sizeof(int[10]));	//int[10]是arr数组的类型
//	
//	short s = 5;
//	int a = 10;
//	printf("%d\n", sizeof(s = a + 2));	//2
//	printf("%d\n", s);	//5,sizeof括号中的表达式是不参与运算的，编译期间处理
//}

//int main()
//{
//	int a = -1;
//	//11111111111111111111111111111111 - 补码
//	int b = ~a;	//按位取反，包括符号位
//	printf("%d\n", b);
//	printf("%d\n", a);
//}

//int main()
//{
//	int a = 10;
//	printf("%p\n", &a);	//& - 取地址操作符
//	int* pa = &a;	//pa是用来存放地址的 - pa就是一个指针变量
//	*pa = 20;	//* - 解引用操作符 - 间接访问操作符
//	printf("%d\n", a);	//20
//
//	return 0;
//}

//int main()
//{
//	int i = 0, a = 0, b = 2, c = 3, d = 4;
//	i = a++ && ++b && d++;
//	//i = a++ || ++b || d++;
//	printf("a = %d\nb = %d\nc = %d\nd = %d\n", a, b, c, d);
//
//	return 0;
//}
